package com.zjj.learn.designmodel.work.proxy.jingtai;

public class StaticProxyTest {


    public static void main(String[] args) {
        //声明真实角色，想表白的人
        MySelf my = new MySelf();
        //想表白的人想说什么
        my.setContext("亲爱的girl，从我第一眼看见你，我就...，就...，我怂了。。。");
        //创建代理对象
        GrilFriend grilFriend = new GrilFriend(my);
        //代理对象帮忙转达
        grilFriend.say();
    }


    /**
     * 静态代理模式的使用
     *     代理模式是一种结构型设计模式，它允许通过使用代理对象来控制对另一个对象的访问。
     *     代理对象通常会拦截对被代理对象的访问，并在其间插入额外的逻辑功能或控制。
     * 举例：
     *    假设你有一个喜欢的女孩，你想要告诉她你对他的爱，但是呢？你是个怂货，不敢直接说，所以你就想通过女孩的闺蜜转达。
     *    在这个过程中就是代理模式的应用
     * 代理模式由以下组成：
     *
     *   1.  抽象角色（Subject）：定义一个接口，该接口是代理对象和被代理对象的共同接口，以便代理对象能够替代被代理对象实现客户端的请求。
     *          在上面的案例中，抽象角色就是：你的爱，想说出来
     *   2.  真实角色（Real  Subject）：实现抽象角色定义的接口，并承担实际处理客户端请求的任务。
     *          在上面的案例中：真实角色就是：你【想表白的人（怂货）】
     *   3.  代理角色（Proxy）：实现抽象角色定义的接口，并保存一个真实角色的引用。代理对象接受客户端的请求，然后转发请求给真实角色。
     *         在上面的案例中：代理角色就是，女孩的闺蜜
     *
     * 使用静态代理模式实现具体：
     *    {@link com.zjj.learn.designmodel.work.proxy.jingtai}
     *
     * 从上面的案例可以看出，代模式的特征是：
     *    1、真实角色和代理角色都需要实现抽象角色，才能都实现真正的目的。
     *    2、真实角色需要聚合到代理角色中，这样代理角色才能够转达真实角色想要表达什么。
     **/


    /**
     * 代理模式和适配器模式的区别
     * 代理模式和适配器模式都是结构型设计模式，并且在代码结构向非常像。但是在解决问题的出发点和关注点还是不一样的
     *
     * 角色组成
     *   代理模式：抽象角色、真实角色和代理角色
     *   适配器模式：目标接口、适配者和适配器
     *
     * 其中代理角色和适配器的作用基本相同。
     * 适配器模式旨在使两个不兼容的接口可以协同工作；而代理模式则旨在实现对目标对象的控制，在不改变目标对象的基础上增强其功能或保护其安全性。
     * 总之，适配器模式主要关注于解决接口的不兼容性问题，而代理模式主要关注于控制对其它对象的访问。
     *
     * 有关代理模式详细介绍请查看：
     *
     * 有关适配器模式详细介绍请查看：
     * https://zhuanlan.zhihu.com/p/627183684
     **/
}
